/**
 * 20080205 0935: Eric Kao, 使用常數傳入, 來取得 Logger<br>
 * 20080102 1648: Eric Kao, E885Exception class move to com.e885.exception.
 */

package com.e885.util.date;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.e885.bundle.E885UtilResourceBundle;
import com.e885.exception.E885UtilException;
import com.e885.log.E885Logger;
import com.e885.util.string.StringUtil;

/**
 * 日期轉成字串, 或字串轉成日期的 tools<br>
 * <br>
 * Copyright: Copyright (c) 2001-2008<br>
 * Company: E885 Group
 * 
 * @author Eric.Kao(gau168.gau@msa.hinet.net)
 * @version 1.0
 */
public class DateStringUtil
{
	/**
	 * 取得目前系統日期時間, 並格式我們要的格式
	 * 
	 * @param formatSytle 格式化的格式
	 * @return 系統日期時間字串
	 */
	public static String fetchCurrentDateString( int formatSytle )
	{
		return transDate2String( new Date(), formatSytle );
	}

	/**
	 * pase 2006/01/01, or 2006/1/1, or 20060101 to 20060101
	 * 
	 * @param source 來源的日期字串
	 * @return String 整合後的字串
	 */
	public static String integrateCenturyDateString( String source )
	{
		if( source == null )
		{
			return null;
		}

		String[] strs = source.split( "/" );

		int length = strs.length;

		if( length == 1 )
			return source;
		else
		{
			if( length != 3 )
			{
				throw new IllegalStateException( "source fomrat is error" );
			}

			StringBuffer buffer = new StringBuffer();

			buffer.append( strs[ 0 ] );
			buffer.append( StringUtil.pendingZero( strs[ 1 ], 2 ) );
			buffer.append( StringUtil.pendingZero( strs[ 2 ], 2 ) );

			return buffer.toString();
		}
	}

	/**
	 * integrate 970302 or 0970302, or 97/03/02, or 97/3/2 to 0970302
	 * 
	 * @param source
	 * @return
	 */
	public static String integrateTWDateString( String source )
	{
		if( source == null )
		{
			return null;
		}

		String[] strs = source.split( "/" );

		int length = strs.length;

		if( length == 1 )
			return StringUtil.pendingZero( source, 7 );
		else
		{
			if( length != 3 )
			{
				throw new IllegalStateException( "source fomrat is error" );
			}

			StringBuffer buffer = new StringBuffer();

			buffer.append( StringUtil.pendingZero( strs[ 0 ], 3 ) );
			buffer.append( StringUtil.pendingZero( strs[ 1 ], 2 ) );
			buffer.append( StringUtil.pendingZero( strs[ 2 ], 2 ) );

			return buffer.toString();
		}
	}

	/**
	 * 將 Date 物件 format 成指定 <code>formatStyle</code> 的字串.<br>
	 * 可自動轉成台灣日期的字串
	 * 
	 * @param date
	 * @param formatStyle
	 * @return
	 */
	public static String transDate2String( Date date, int formatStyle )
	{
		if( date == null )
		{
			return "";
		}

		// 台灣日期
		if( formatStyle < CenturyFormatStyle.CENTURY_FORMAT_STYLE_START )
			date = DateUtil.transCentury2TWDate( date );

		return fetchDateFormat( formatStyle ).format( date );
	}

	/**
	 * 取得中文的西元日期
	 * @param source 2006/01/01, or 2006/1/1, or 20060101 以上三種格式都可以
	 * @param prefix true, 加入"西元"二個字
	 * @return 中文的西元日期, 如: 2006年03月22日
	 */
	public static String transString2CenturyDateString( String source, boolean prefix )
	{
		source = integrateCenturyDateString( source );

		StringBuffer buffer = new StringBuffer();

		if( prefix )
			buffer.append( CenturyFormatStyle.PREFIX_NAME );

		buffer.append( source.substring( 0, 4 ) );
		buffer.append( "年" );
		buffer.append( source.substring( 4, 6 ) );
		buffer.append( "月" );
		buffer.append( source.substring( 6, 8 ) );
		buffer.append( "日" );

		return buffer.toString();
	}

	/**
	 * 將字串 format 成指定 <code>formatStyle</code> 的 Date 物件.<br>
	 * 西元日期和台灣日期會自動判斷<br>
	 * 如: 97/03/22, 也會轉成 2008/03/22
	 * 
	 * @param value
	 * @param formatStyle
	 * @return
	 * @throws E885UtilException
	 */
	public static Date transString2Date( String value, int formatStyle ) throws E885UtilException
	{
		if( value == null || value.trim().length() == 0 )
		{
			return null;
		}

		Date date = null;
		try
		{
			date = fetchDateFormat( formatStyle ).parse( value );

			// 西元日期
			if( formatStyle >= CenturyFormatStyle.CENTURY_FORMAT_STYLE_START )
				return date;
			else
				return DateUtil.transTW2CenturyDate( date );
		}
		catch( ParseException ex )
		{
			String message = E885UtilResourceBundle.getString( "e885Util.dateStringUtil.error.format" );
			
			message = message + "[" + value + "]";

			E885Logger.utilLog.error( message );

			throw new E885UtilException( message, ex );
		}
		finally
		{
			date = null;
		}
	}
	
	/**
	 * 取得中文的台灣日期
	 * @param source 970302 or 0970302, or 97/03/02, or 97/3/2 以上四種格式都可以
	 * @param prefix true, 加入"民國"二個字
	 * @return 中文的台灣日期, 如: 97年03月22日
	 */
	public static String transString2TWDateString( String source, boolean prefix )
	{
		source = integrateTWDateString( source );

		StringBuffer buffer = new StringBuffer();

		if( prefix )
			buffer.append( TWFormatStyle.PREFIX_NAME );
		
		String year = source.substring( 0, 3 );
		if( year.startsWith( "0" ) )
			year = year.substring( 1, 3 );
		
		buffer.append( year );
		buffer.append( "年" );
		buffer.append( source.substring( 3, 5 ) );
		buffer.append( "月" );
		buffer.append( source.substring( 5, 7 ) );
		buffer.append( "日" );

		return buffer.toString();
	}

	/**
	 * 依照 <code>formatStyle</code> 取得 SimpleDateFormat
	 * 
	 * @param formatStyle date format style
	 * @return the instance of SimpleDateFormat
	 */
	private static SimpleDateFormat fetchDateFormat( int formatStyle )
	{
		if( formatStyle == TWFormatStyle.PREFIX_HALF_STRING_FORMAT_STYLE )
		{
			return TWFormatStyle.PREFIX_HALF_STRING_FORMAT;
		}
		else if( formatStyle == TWFormatStyle.PREFIX_FULL_STRING_FORMAT_STYLE )
		{
			return TWFormatStyle.PREFIX_FULL_STRING_FORMAT;
		}
		else if( formatStyle == TWFormatStyle.HALF_STRING_FORMAT_STYLE )
		{
			return TWFormatStyle.HALF_STRING_FORMAT;
		}
		else if( formatStyle == TWFormatStyle.FULL_STRING_FORMAT_STYLE )
		{
			return TWFormatStyle.FULL_STRING_FORMAT;
		}
		else if( formatStyle == CenturyFormatStyle.SLASH_HALF_FORMAT_STYLE )
		{
			return CenturyFormatStyle.SLASH_HALF_FORMAT;
		}
		else if( formatStyle == CenturyFormatStyle.SLASH_FULL_FORMAT_STYLE )
		{
			return CenturyFormatStyle.SLASH_FULL_FORMAT;
		}
		else if( formatStyle == CenturyFormatStyle.HALF_FORMAT_STYLE )
		{
			return CenturyFormatStyle.HALF_FORMAT;
		}
		else if( formatStyle == CenturyFormatStyle.FULL_FORMAT_STYLE )
		{
			return CenturyFormatStyle.FULL_FORMAT;
		}
		else if( formatStyle == TWFormatStyle.HALF_NUMBER_FORMAT_STYLE )
		{
			return TWFormatStyle.HALF_NUMBER_FORMAT;
		}
		else if( formatStyle == TWFormatStyle.SLASH_HALF_NUMBER_FORMAT_STYLE )
		{
			return TWFormatStyle.SLASH_HALF_NUMBER_FORMAT;
		}
		else
		{
			throw new IllegalArgumentException( "the parameter formatStyle is error" );
		}
	}
}
